home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / splitit.arc / splitit.c < prev    next >
C/C++ Source or Header  |  1990-02-06  |  13KB  |  667 lines

  1. #include    <aes.h>
  2. #include    <stdio.h>
  3. #include    <tos.h>
  4. #include    <ctype.h>
  5. #include    <string.h>
  6. #include    <stdlib.h>
  7. #include    <strins.c>
  8.  
  9. #include    "splitit.h"
  10. extern    int            rs_trloc[];
  11. extern    OBJECT        *rs_trindex[];
  12. extern    void        fix_objects(void);
  13. extern    char        p_to_nul[];
  14. extern    TEDINFO        rs_tedinfo[];
  15. extern    ICONBLK        rs_iconblk[];
  16. extern    int            bbk000[];
  17. extern    BITBLK        rs_bitblk[];
  18. extern    OBJECT        rs_object[];
  19.  
  20. #define    SHOW    1
  21. #define HIDE    0
  22. #define TRUE    1
  23. #define FALSE    0
  24. #define READ    0
  25. #define WRITE    1
  26. /**************************************
  27.     Message to user in (c)
  28. ***************************************/
  29. void mess(char *c)
  30.     {
  31.     char     a[40];
  32.     
  33.     graf_mouse(ARROW,0);
  34.     strcpy(a,"[3][");
  35.     strcat(a,c);
  36.     strcat(a,"][OK]");
  37.     form_alert(1,a);
  38.     graf_mouse(POINT_HAND,0);
  39.     }
  40.  
  41. int    mess2(
  42.     char    *c1,    /*    Line one of message    */
  43.     char    *c2,    /*  Line two            */
  44.     char    *b1,    /*  Button one text        */
  45.     char    *b2,    /*    Button two text        */
  46.     int        db    )    /*    Default Button #    */
  47.     {
  48.     char     a[80];
  49.     
  50.     graf_mouse(ARROW,0);
  51.     strcpy(a,"[2][");
  52.     strcat(a,c1);
  53.     strcat(a,"|");
  54.     strcat(a,c2);
  55.     strcat(a,"][");
  56.     strcat(a,b1);
  57.     strcat(a,"|");
  58.     strcat(a,b2);
  59.     strcat(a,"]");
  60.     db = form_alert(db+1,a) - 1;
  61.     graf_mouse(POINT_HAND,0);
  62.     return(db);
  63.     }
  64.  
  65.  
  66. void messi(int    i)
  67.     {
  68.     char    m[16];
  69.     sprintf(m,"%d",i);
  70.     mess(m);
  71.     }
  72.  
  73. void messl(long    l)
  74.     {
  75.     char    m[16];
  76.     sprintf(m,"%ld",l);
  77.     mess(m);
  78.     }
  79.  
  80. /*******************************
  81.     GEM Related Functions
  82. *******************************/
  83.     
  84. /***********************************
  85.     Will put dialog box on screen
  86.     and return exit object after
  87.     erasing it.
  88. ***********************************/
  89. void erase_dialog(
  90.     int    x,
  91.     int    y,
  92.     int    w,
  93.     int    h    )
  94.     {
  95.     int sx,sy;
  96.     sx=x+(w/2);
  97.     sy=y+(h/2);
  98.     form_dial(FMD_SHRINK,sx,sy,0,0,x,y,w,h);
  99.     form_dial(FMD_FINISH,sx,sy,0,0,x,y,w,h);
  100.     }
  101.  
  102. #define DDRC    0
  103. #define DDRN    1
  104. #define DDRS    2
  105. #define DDRW    4
  106. #define DDRE    8
  107. void draw_dialog(
  108.     int        box_ind,
  109.     int        *x,
  110.     int        *y,
  111.     int        *w,
  112.     int        *h,
  113.     int        place,    /* 1-N,2-S,4-W,8-E,15-C,5-NW,6-SW,9-NE,10-SE */
  114.     char    draw    )
  115.     {
  116.     int        sx,sy;
  117.     
  118.     form_center(rs_trindex[box_ind],x,y,w,h);
  119.     *x += (160*(((place & DDRE)/DDRE)-((place & DDRW)/DDRW)));
  120.     *y += (100*(((place & DDRS)/DDRS)-((place & DDRN)/DDRN)));
  121.     sx=*x+(*w/2);
  122.     sy=*y+(*h/2);
  123.  
  124.     form_dial(FMD_START,sx,sy,0,0,*x,*y,*w,*h); 
  125.     form_dial(FMD_GROW,sx,sy,0,0,*x,*y,*w,*h);
  126.     if (draw) objc_draw(rs_trindex[box_ind],0,10,*x,*y,*w,*h);
  127.     }
  128.     
  129. void dial_draw(
  130.     int box_ind,
  131.     int    obj    )
  132.     {
  133.     int        x1,y1;
  134.     OBJECT    *redraw;
  135.  
  136.     redraw = &rs_object[rs_trloc[box_ind]+obj];
  137.     objc_offset(rs_trindex[box_ind],obj,&x1,&y1);
  138.     objc_draw(rs_trindex[box_ind],0,10,x1,y1,redraw->ob_width,redraw->ob_height);
  139.     }
  140.  
  141. int    exit_dialog(
  142.     int box_ind,
  143.     int    x,
  144.     int    y,
  145.     int    w,
  146.     int    h,
  147.     int    draw    )
  148.     {
  149.     int     e;
  150.     
  151.     if (draw) objc_draw(rs_trindex[box_ind],0,10,x,y,w,h);
  152.     e = form_do(rs_trindex[box_ind],0);
  153.     rs_object[rs_trloc[box_ind]+e].ob_state &= UNSELECT;
  154.     dial_draw(box_ind,e);
  155.     return(e);
  156.     }
  157.  
  158. void redraw_dialog(
  159.     int    box_ind,
  160.     int    x,
  161.     int    y,
  162.     int    w,
  163.     int    h    )
  164.     {
  165.     objc_draw(rs_trindex[box_ind],0,10,x,y,w,h);
  166.     }
  167.  
  168. void dial2_draw(
  169.     int box_ind,
  170.     int    obj1,
  171.     int    obj2    )
  172.     {
  173.     int        x1,y1;
  174.     int        x2,y2;
  175.     int        w,h;
  176.     OBJECT    *redraw1,*redraw2;
  177.     
  178.     redraw1 = &rs_object[rs_trloc[box_ind]+obj1];
  179.     redraw2 = &rs_object[rs_trloc[box_ind]+obj2];
  180.     objc_offset(rs_trindex[box_ind],obj1,&x1,&y1);
  181.     objc_offset(rs_trindex[box_ind],obj2,&x2,&y2);
  182.     w = x2-x1+redraw2->ob_width;
  183.     h = y2-y1+redraw2->ob_height;
  184.     if (w < redraw1->ob_width)    w = redraw1->ob_width;
  185.     if (h < redraw1->ob_height)    h = redraw1->ob_height;
  186.     objc_draw(rs_trindex[box_ind],0,10,x1,y1,w,h);
  187.     }
  188.  
  189. /*******************************
  190.     Select a file
  191. *******************************/
  192. int fileselect(
  193.     char     *s,
  194.     char    *ext    )
  195.     {
  196.     char    p[64];
  197.     int        n;
  198.     int        drv;
  199.  
  200.     drv = Dgetdrv();
  201.     Dgetpath(p,0);
  202.     if (p[0] != '\\')    strinc(p,0,'\\');
  203.     strins(p,0,"A:");
  204.     while (drv > 0)
  205.         {
  206.         --drv;
  207.         ++p[0];
  208.         }
  209.     if (p[strlen(p)-1] != '\\')    strcat(p,"\\");
  210.     strcat(p,ext);
  211.     graf_mouse(ARROW,0);
  212.     fsel_input(p,s,&n);
  213.     graf_mouse(POINT_HAND,0);
  214.     if (strrchr(p,'\\') != strchr(p,'\\'))
  215.         *(strrchr(p,'\\')) = 0x0;
  216.     else
  217.         *(strrchr(p,'\\')+1) = 0x0;
  218.     while (*p > 'A')
  219.         {
  220.         --p[0];
  221.         ++drv;
  222.         }
  223.     Dsetdrv(drv);
  224.     Dsetpath(p+2);
  225.     return(n);
  226.     }
  227.  
  228. /**************************
  229.     Create buffer of
  230.     size bytes or a fraction
  231.     thereof
  232. **************************/
  233. void *mport(
  234.     unsigned long    wanted,
  235.     unsigned long    *received
  236.     )
  237.     {
  238.     void    *buf;
  239.     *received = wanted;
  240.     while ((buf = malloc(*received))==NULL)
  241.         *received /= 2;
  242.     return(buf);
  243.     }
  244.  
  245. /**************************
  246.     Show file and length
  247.     in COPY dialog
  248. **************************/
  249. void dial_file(
  250.     char    *name,
  251.     long    length,
  252.     int        x,
  253.     int        y,
  254.     int        w,
  255.     int        h
  256.     )
  257.     {
  258.     strncpy((char *)rs_object[rs_trloc[FILEDIAL]+FILENAME].ob_spec,name,16);
  259.     sprintf((char *)rs_object[rs_trloc[FILEDIAL]+FILESIZE].ob_spec,"%ld\0",length);
  260.     redraw_dialog(FILEDIAL,x,y,w,h);
  261.     }
  262.  
  263. /**************************
  264.     Input K size to split
  265.     file into
  266. **************************/
  267. unsigned long dialk(void)
  268.     {
  269.     int    x,y,w,h;
  270.     int    k=0;
  271.     
  272.     draw_dialog(SIZEDIAL,&x,&y,&w,&h,DDRC,HIDE);
  273.     while (k==0)
  274.         {
  275.         exit_dialog(SIZEDIAL,x,y,w,h,SHOW);
  276.         k = atoi(((TEDINFO *)(rs_object[rs_trloc[SIZEDIAL]+SIZEEXIT].ob_spec))->te_ptext);
  277.         }
  278.     erase_dialog(x,y,w,h);
  279.     return((unsigned long)k);
  280.     }
  281.  
  282. /***************************
  283.     Open a new file
  284. ***************************/
  285. int create(char *name)
  286.     {
  287.     if (Fsfirst(name,7)>=0)
  288.         {
  289.         Fgetdta();
  290.         if (mess2("Overwrite file?",name,"Nay","Yeah",1))
  291.             Fdelete(name);
  292.         else
  293.             return(0);
  294.         }
  295.     Fclose(Fcreate(name,0));
  296.     return(1);
  297.     }
  298.  
  299. /**************************
  300.     Split file
  301. **************************/
  302. void split(void)
  303.     {
  304.     static char     *name = "FILENAME.EXT";
  305.     static char     *ext  = "*.*\0        ";
  306.     DTA                *dta;
  307.     int                x,y,w,h,fd,fds;
  308.     int                p,drv;
  309.     char            filename[16];
  310.     unsigned long    size,bsize,i,j,k,iold;
  311.     char            sifile[16],path[64];
  312.     void            *buf;
  313.  
  314.     i = 0;
  315.     if (fileselect(name,ext))
  316.         if (Fsfirst(name,7)>=0)
  317.             {
  318.             dta = Fgetdta();
  319.             size = dta->filesize;
  320.             strcpy(filename,dta->filename);
  321.             k = dialk();
  322.             drv = Dgetdrv();
  323.             Dgetpath(path,0);
  324.             if (path[0] != '\\')
  325.                 strinc(path,0,'\\');
  326.             fds=Fopen(filename,READ);
  327.             mess("Select destination path");
  328.             fileselect(name,ext);
  329.             draw_dialog(FILEDIAL,&x,&y,&w,&h,DDRC,HIDE);
  330.             dial_file(filename,size,x,y,w,h);
  331.             buf = mport(k*1024L,&bsize);
  332.             sprintf(sifile,"SI_");
  333.             for (p=3;(p<9)&&(filename[p-3]!='.')&&(filename[p-3]!='\0');p++)
  334.                 sifile[p] = filename[p-3];
  335.             for (j=0;j<((size/(k*1024L))+1);j++)
  336.                 {
  337.                 sprintf(sifile+p-1,".%3ld\0",j);
  338.                 if (j<100)
  339.                     {
  340.                     *(sifile+p)='0';
  341.                     if (j<10)
  342.                         *(sifile+p+1)='0';
  343.                     }
  344.                 if ((i+(k*1024))>size)
  345.                     dial_file(sifile,size-i,x,y,w,h);
  346.                 else
  347.                     dial_file(sifile,1024L * k,x,y,w,h);
  348.                 fd=Fcreate(sifile,0);
  349.                 Fclose(fd);
  350.                 fd=Fopen(sifile,WRITE);
  351.                 if (j==0)
  352.                     Fwrite(fd,16,filename);
  353.                 iold = i;
  354.                 while (i < (iold+(k*1024)))
  355.                     {
  356.                     if ((i+bsize)>size)
  357.                         {
  358.                         Fread(fds,size-i,buf);
  359.                         Fwrite(fd,size-i,buf);
  360.                         }
  361.                     else
  362.                         {
  363.                         Fread(fds,bsize,buf);
  364.                         Fwrite(fd,bsize,buf);
  365.                         }
  366.                     i += bsize;
  367.                     }
  368.                 Fclose(fd);
  369.                 }
  370.             Fclose(fds);
  371.             Dsetdrv(drv);
  372.             Dsetpath(path);
  373.             if (mess2("Erase original",filename,"Nay","Yeah",1))
  374.                 Fdelete(filename);
  375.             erase_dialog(x,y,w,h);
  376.             free(buf);
  377.             }
  378.     }
  379.  
  380. /**************************
  381.     Join files
  382. **************************/
  383. void join(void)
  384.     {
  385.     static char *name = "FILENAME.EXT";
  386.     static char *ext  = "SI_?????.000";
  387.     DTA            *dta;
  388.     int            x,y,w,h,fd,fds;
  389.     int            j;
  390.     char        filename[16];
  391.     long        size;
  392.     char        sifile[16];
  393.     char        *p;
  394.     void        *buf;
  395.     char        spath[64],dpath[64];
  396.     int            sdrv,ddrv;
  397.     int            dflag;
  398.     
  399.     if (fileselect(name,ext))
  400.         {
  401.         sdrv = Dgetdrv();
  402.         Dgetpath(spath,0);
  403.         if (spath[0] != '\\')
  404.             strinc(spath,0,'\\');
  405.         draw_dialog(FILEDIAL,&x,&y,&w,&h,DDRC,HIDE);
  406.         strcpy(sifile,name);
  407.         mess("Select destination path");
  408.         if (fileselect(name,ext))
  409.             {
  410.             ddrv = Dgetdrv();
  411.             Dgetpath(dpath,0);
  412.             if (dpath[0] != '\\')
  413.                 strinc(dpath,0,'\\');
  414.             p = strchr(sifile,'.');
  415.             dflag = mess2("Delete pieces as","they are used?","Nay","Yeah",1);
  416.             for (j=0;;j++)
  417.                 {
  418.                 sprintf(p,".%3d\0",j);
  419.                 if (j<100)
  420.                     {
  421.                     *(p+1)='0';
  422.                     if (j<10)
  423.                         *(p+2)='0';
  424.                     }
  425.                 Dsetdrv(s